package ar.com.PanteraRosa.Business;

import java.util.HashMap;

import java.util.Iterator;

import org.json.JSONException;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.util.Pair;
import ar.com.PanteraRosa.Common.Conf;
import ar.com.PanteraRosa.Entity.User;
import ar.com.PanteraRosa.Model.UserDao;
import ar.com.PanteraRosa.Model.UserWebService;

/**
 * 
 * @desc maneja el modelo de datos de un User tanto Cloud como Mobile
 * @date 01/03/2012
 * @author pantera
 *
 */
public class UserController {

    public User user;
    public UserDao userDao;
    private UserWebService userWebService;
    

    /**
     * 
     * @param ctx tiene que ser la activity que lo instancia
     */
    public UserController(Context ctx) {
	this.user = new User();
	this.userDao = new UserDao(ctx);
	this.userWebService = new UserWebService();
    }
    

    /**
     * actualiza la bd de Users del Mobile tomando como referencia la bd de la web
     * @throws JSONException
     */
    public void updateUsersOnMobile() throws JSONException {
	//this.userDao.open();
	HashMap<Integer, User> tablaIdUser = userWebService.parseJSONdata(userWebService.getUsers(), "user");

	Iterator<Integer> it = tablaIdUser.keySet().iterator();
	while (it.hasNext()) 
	{ 
	    Integer key = (Integer) it.next();
	    Pair<Integer, User> parIdUser = Pair.create(key, tablaIdUser.get(key));

	    insertUserOnMobile(parIdUser);
	}
	//this.userDao.cerrar();
    }
    
    /**
     * Devuelve si existe o no el susuario
     * @param nick del usuario a buscar
     * @return true si existe
     */
    public boolean existUser(String nick)
    {
	Cursor mCursor = this.userDao.cargarPorNick(nick);
	
	return true ==(mCursor.getCount() > 0) ? true : false;
    }
    
    
    /**
     * actualiza la bd de Users del Mobile tomando como referencia jsonData 
     * que es un string json que surgio de hacer un join entre users y contacts
     * @param jsonData
     * @throws JSONException
     */
    public void updateUsersOnMobile(String jsonData) throws JSONException {
	//this.userDao.open();
	HashMap<Integer, User> tablaIdUser = userWebService.parseJSONdata(jsonData, "contact");

	Iterator<Integer> it = tablaIdUser.keySet().iterator();
	while (it.hasNext()) 
	{ 
	    Integer key = (Integer) it.next();
	    Pair<Integer, User> parIdUser = Pair.create(key, tablaIdUser.get(key));
	    
	    if(!existUser(parIdUser.second.getUserNick())) 
		insertUserOnMobile(parIdUser);
	}
	//this.userDao.cerrar();
    }    

    /**
     * inserta el dato traido por el Hash a la bd del celular
     * @param parIdUser par de id de usuario y usario de tipo user
     */
    public void insertUserOnMobile(Pair<Integer, User> parIdUser) {
	
	this.userDao.crear(parIdUser.second.getUserNick(), 
		parIdUser.second.getUserPassword(), 
		parIdUser.second.getUserFirstName(), 
		parIdUser.second.getUserLastName(), 
		parIdUser.second.getUserEmail());
    }
    
    
    /**
     * elimina el usuario de id rowId y devuelve true si es que lo encuentra
     * sino false
     * @param rowId
     * @return resultado de operacion true si lo elimna si no false .
     */
    public boolean deleteUserOnMobile(long rowId) {
	return this.userDao.eliminar(rowId);
    }
    
    
    /**
     * devuelve todos los usuarios en la bd del Mobile 
     * @param rowId
     * @return Cursor over all users
     * @throws SQLException
     */
    public Cursor loadAllUsersOnMobile(){
	return this.userDao.cargarTodos();    
    }
    
    
    /**
     * Busca en la bd del Mobile el usuario de UserId rowId
     * @param rowId id de User a buscar en la bd del Mobile
     * @return si encontro rowId puntero al User encontrado sino SQLException
     * @throws SQLException
     */
    public Cursor loadByIdUserOnMobile(long rowId) throws SQLException {
	//this.userDao.open();
	Cursor rdo = this.userDao.cargarPorId(rowId);    
	//this.userDao.cerrar();
	return rdo;
    }
    
    
    /**
     * actualiza un user en la base de datos del Mobile
     * @param user
     * @return
     */
    public boolean updateUserOnMobile(User user){
	return this.userDao.actualizar(user.getUserID(), 
		user.getUserFirstName(), 
		user.getUserLastName(), 
		user.getUserEmail(), 
		user.getUserNick());
    }
    
    /**
     * TODO validar params (cosa q el usuario sea valido) y cambiar el return siempre true 
     * @param user
     * @return
     */
    public boolean insertUserOnCloud(User user){
	String strUser;
	String params = "UserFirstName="+user.getUserFirstName()+
			"&UserLastName="+user.getUserLastName()+
			"&UserPassword="+user.getUserPassword()+
			"&UserEmail="+user.getUserEmail()+
			"&UserNick="+user.getUserNick();
	
	//str con parametros usados
	strUser = params;
	
	//prueba harcodeada
	//strUser = "UserFirstName=jason2&UserLastName=jason3&UserPassword=jason4&UserEmail=jason5&UserNick=jason1";
	
	this.userWebService.insertUser(strUser);	
	return true;
    }
    
    
    /**
     * TODO 
     * @param user
     * @return
     */
    public boolean updateUserOnCloud(User user){
    
	return true;
    }    
    
    /**
     * TODO
     * @param rowId
     * @return
     */
    public boolean deleteUserOnCloud(long rowId){
    
	return true;
    }    
    
    
    /**
     * 
     * @param nick
     * @param password
     * @throws JSONException 
     */
    public void login(String nick, String password) throws JSONException
    {
	this.user.setUserNick(nick);
	this.user.setUserPassword(password);
	this.userWebService.login(user);
    }
    
    
    /**
     * se desloguea el usuario
     */
    public void logOut() 
    {
	Conf.getInstance().setLogged(false);
	Conf.getInstance().setUser(null);
    }    

}//fin UserController









